<?php
//dezend by http://www.yunlu99.com/ QQ:270656184
class CI_Parser
{
	/**
	 * Left delimiter character for pseudo vars
	 *
	 * @var string
	 */
	public $l_delim = '{';
	/**
	 * Right delimiter character for pseudo vars
	 *
	 * @var string
	 */
	public $r_delim = '}';
	/**
	 * Reference to CodeIgniter instance
	 *
	 * @var object
	 */
	protected $CI;

	public function __construct()
	{
		$this->CI = &get_instance();
		log_message('info', 'Parser Class Initialized');
	}

	public function parse($template, $data, $return = false)
	{
		$template = $this->CI->load->view($template, $data, true);
		return $this->_parse($template, $data, $return);
	}

	public function parse_string($template, $data, $return = false)
	{
		return $this->_parse($template, $data, $return);
	}

	protected function _parse($template, $data, $return = false)
	{
		if ($template === '') {
			return false;
		}

		$replace = array();

		foreach ($data as $key => $val) {
			$replace = array_merge($replace, is_array($val) ? $this->_parse_pair($key, $val, $template) : $this->_parse_single($key, (string) $val, $template));
		}

		unset($data);
		$template = strtr($template, $replace);

		if ($return === false) {
			$this->CI->output->append_output($template);
		}

		return $template;
	}

	public function set_delimiters($l = '{', $r = '}')
	{
		$this->l_delim = $l;
		$this->r_delim = $r;
	}

	protected function _parse_single($key, $val, $string)
	{
		return array($this->l_delim . $key . $this->r_delim => (string) $val);
	}

	protected function _parse_pair($variable, $data, $string)
	{
		$replace = array();
		preg_match_all('#' . preg_quote($this->l_delim . $variable . $this->r_delim) . '(.+?)' . preg_quote($this->l_delim . '/' . $variable . $this->r_delim) . '#s', $string, $matches, PREG_SET_ORDER);

		foreach ($matches as $match) {
			$str = '';

			foreach ($data as $row) {
				$temp = array();

				foreach ($row as $key => $val) {
					if (is_array($val)) {
						$pair = $this->_parse_pair($key, $val, $match[1]);

						if (!empty($pair)) {
							$temp = array_merge($temp, $pair);
						}

						continue;
					}

					$temp[$this->l_delim . $key . $this->r_delim] = $val;
				}

				$str .= strtr($match[1], $temp);
			}

			$replace[$match[0]] = $str;
		}

		return $replace;
	}
}

defined('BASEPATH') || exit('No direct script access allowed');

?>
